package com.kylin.generator.domain;

import com.kylin.shared.common.domain.BaseDomain;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
import org.apache.commons.lang.StringUtils;

/**
 * 代码生成-字段信息类
 * @author Damon S.
 * @version v1.0.1
 * @date 2021年02月04日 18:16
 */
@Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public class GenColumn extends BaseDomain {
    /** 编号 */
    private Long columnId;
    /** 归属表编号 */
    private Long tableId;
    /** 列名称 */
    private String columnName;
    /** 列描述 */
    private String columnComment;
    /** 列类型 */
    private String columnType;
    /** JAVA类型 */
    private String javaType;
    /** JAVA字段名 */
    private String javaField;
    /** 是否主键（1是） */
    private String isPk;
    /** 是否自增（1是） */
    private String isIncrement;
    /** 是否必填（1是） */
    private String isRequired;
    /** 是否为插入字段（1是） */
    private String isInsert;
    /** 是否编辑字段（1是） */
    private String isEdit;
    /** 是否列表字段（1是） */
    private String isList;
    /** 是否查询字段（1是） */
    private String isQuery;
    /** 查询方式（EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围） */
    private String queryType;
    /** 显示类型（input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、upload上传控件、summernote富文本控件） */
    private String htmlType;
    /** 字典类型 */
    private String dictType;
    /** 排序 */
    private Integer sort;

    public String getCapJavaField() {
        return StringUtils.capitalize(javaField);
    }

    public boolean isSuperColumn() {
        return isSuperColumn(this.javaField);
    }

    public static boolean isSuperColumn(String javaField) {
        return StringUtils.equalsAnyIgnoreCase(javaField,
                // BaseEntity
                "createdBy", "createdAt", "updatedBy", "updatedAt", "removedBy", "removedAt",
                // TreeEntity
                "parentName", "parentId", "orderNum", "ancestors");
    }

    public boolean isUsableColumn() {
        return isUsableColumn(javaField);
    }

    public static boolean isUsableColumn(String javaField) {
        // isSuperColumn()中的名单用于避免生成多余Domain属性，若某些属性在生成页面时需要用到不能忽略，则放在此处白名单
        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
    }

    public String readConverterExp() {
        String remarks = StringUtils.substringBetween(this.columnComment, "（", "）");
        if (StringUtils.isEmpty(remarks)) {
            return this.columnComment;
        }
        StringBuilder sb = new StringBuilder();
        for (String value : remarks.split(" ")) {
            if (StringUtils.isNotEmpty(value)) {
                Object startStr = value.subSequence(0, 1);
                String endStr = value.substring(1);
                sb.append(startStr).append("=").append(endStr).append(",");
            }
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
}